//
//  49.把字符串转换成整数.swift
//  数据结构与算法
//
//  Created by ZERO on 2021/5/29.
//

import Foundation
/*
 题目：将一个字符串转换成一个整数，要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0
 */
func offer_49() {
    print(Solution().StrToInt2("-9223372036854775807"))
}

fileprivate class Solution {
    func StrToInt1(_ str: String) -> Int {
        return Int(str) ?? 0
    }
    
    func StrToInt2(_ str: String) -> Int {
        guard !str.isEmpty else { return 0 }
        var result: Int = 0
        let isNegativeNumber = str[str.startIndex] == "-" ? -1 : 1
        var overValue = 0
        var isContainSymbol = false
        for char in str {
            if (String(char) == "+" || String(char) == "-") {
                if isContainSymbol {
                    return 0
                } else {
                    isContainSymbol = true
                    continue
                }
            }
            if char >= "0" && char <= "9" {
                let digit = Int(char.asciiValue! - (Character("0").asciiValue!))
                // overValue表示本轮循环是否会越界
                overValue = isNegativeNumber*result - Int.max/10 + (((isNegativeNumber+1)/2 + digit) > Int.max%10+1 ? 1 : 0)
                if overValue > 0 { return 0 }
                result = result * 10 + isNegativeNumber * digit
            } else {
                return 0
            }
        }
        return result
    }
}


